package com.crm.dao.mapper.customMapper.customerContractCustomMapper;

import com.crm.model.entity.contractManager.CustomerContract;
import com.crm.model.entity.contractManager.RepaymentAbility;
import com.crm.model.qo.contractManager.CustomerContractQO;
import com.crm.model.qo.customerManager.AnalyseCustomerQO;
import com.crm.model.vo.csd.customerManager.ContractDetailVO;
import com.crm.model.vo.customerContractManager.*;
import com.crm.model.vo.datasearch.DataSearchResultVO;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @Author yincuimei
 * 合同管理
 * @Date 2021/3/12 11:40
 */
public interface CustomerContractCustomMapper {

    /**
     * (超级管理员、普通管理员、普通用户)合同管理--合同列表
     *
     * @param accountId ---当前登录人账号ID(查询个人数据时)改为调用selectUserCustomerContractVOList
     * @param companyId ---当前登录人所属公司ID(普通管理员查询本公司数据时)
     * @param dateUnit  ---全部、本周、本月查询条件
     * @return
     * @author yincuimei
     */
    List<CustomerContractVO> selectCustomerContractVOList(@Param("customerContractQO") CustomerContractQO customerContractQO, @Param("dateUnit") Integer dateUnit, @Param("sortOrder") String sortOrder, @Param("accountId") String accountId,
                                                          @Param("companyId") String companyId);

    /**
     * (用户系统)合同管理--合同列表
     *
     * @param customerContractQO ---查询条件
     * @param dateUnit           ---全部、上月、本周、本月、本年查询条件
     * @param sortOrder          ---排序
     * @return
     */
    List<CustomerContractVO> selectUserCustomerContractVOList(@Param("customerContractQO") CustomerContractQO customerContractQO, @Param("dateUnit") Integer dateUnit, @Param("sortOrder") String sortOrder, @Param("accountId") String accountId);

    /**
     * 合同列表--查看(合同详情)
     *
     * @param contractId ---合同ID
     * @return
     * @author yincuimei
     */
    CustomerContractDetailVO selectCustomerContractVODetail(@Param("contractId") String contractId);

    /**
     * 合同作废时后端校验合同状态及回款状态
     * @param contractId
     * @return
     */
    Map selectContractAndPaymentStatus(String contractId);

    /**
     * 联系人详情-订单合同-通过联系人id
     *
     * @param contactId      联系人id
     * @param contractNumber 合同编号
     * @param sortOrder      分组类型
     * @return
     */
    List<ContactDetailByCustomerContractVO> selectCustomerContractByContactId(@Param("contactId") String contactId, @Param("contractNumber") String contractNumber, @Param("sortOrder") String sortOrder);

    /**
     * 查询新单会员数量
     *
     * @param qo
     * @return
     */
    List<Long> selectNewVipCount(AnalyseCustomerQO qo);

    /**
     * 查询续费会员合同
     *
     * @param qo
     * @return
     */
    List<Long> selectRenewalVipCount(AnalyseCustomerQO qo);

    /**
     * 会员合同数量
     *
     * @return
     */
    BigDecimal selectMackAddVipCount(AnalyseCustomerQO qo);

    /**
     * 续费合同数量
     *
     * @param qo
     * @return
     */
    BigDecimal selectRenewalVip(AnalyseCustomerQO qo);

    /**
     * 会员订单总数量
     *
     * @param qo
     * @return
     */
    Long selectMakeVipCount(AnalyseCustomerQO qo);

    /**
     * 计算客户转换排名
     *
     * @param qo
     * @return
     */
    Long selectCustomerSwitchNum(AnalyseCustomerQO qo);

    /**
     * 计算会员拥有排名
     *
     * @param qo
     * @return
     */
    Long selectVipOwnNum(AnalyseCustomerQO qo);

    /**
     * 根据会员id查询会员的开始时间和结束时间
     *
     * @param customerId
     * @return
     */
    CustomerContractVO getCustomerVipDateByCustomerId(@Param("customerId") String customerId);


    /**
     * @Description: 通过合同编号获取数据
     * @Param: [contractNum]
     * @Return: java.util.List<com.crm.model.vo.datasearch.DataSearchResultVO>
     * @Author: lixq-f
     * @Date: 2021/5/13
     **/
    List<DataSearchResultVO> selectDataByContractNum(@Param("contractNum") String contractNum);


    /**
     * @Description: 查询单品合同列表
     * @Param: [customerContractQO, orderStr]
     * @Return: java.util.List<com.crm.model.vo.customerContractManager.CustomerContractVO>
     * @Author: lixq-f
     * @Date: 2021/6/17
     **/
    List<CustomerContractVO> selectSingleContractList(@Param("customerContractQO") CustomerContractQO customerContractQO,
                                                      @Param("orderStr") String orderStr);

    /**
     * 商机详情-查询商机客户下面未过期的合同
     * @param customerId 客户id
     * @return
     */
    List<CustomerContractVO> selectByCustomerId(@Param("customerId") String customerId);

    List<String> selectCustomerContractDeveloperHistoryContractIdList();

    /**
     * (客服部)-》客户列表-》查看-》合同&订单-》编辑合同详情
     * @param contractId --合同ID
     * @return
     */
    ContractDetailVO selectContractDetailVO(@Param("contractId") String contractId);

    /**
     * 客服部根据客户id查询合同联系人列表
     * @param customerId
     * @param sortOrder
     * @param auditStatusList
     * @param onTheJobSituationList
     * @return
     */
    List<ContractContactVO> selectContractContactByCustomerId(@Param("customerId") String customerId,@Param("sortOrder") String sortOrder,@Param("auditStatusList") List<Integer> auditStatusList,@Param("onTheJobSituationList") List<Integer> onTheJobSituationList);

    /**
     * (客服部)--编辑客户时查询合同表生效中合同的开始日期及结束日期
     * @param customerId --客户ID
     * @author yincuimei
     * @return
     */
    List<Map<String, Date>> selectCustomerContractByCustomerId(@Param("customerId") String customerId);

    /**
     *  批量补充合同表客户信息(临时用补充正式库数据:customer_id;customer_name为空的)
     * @param customerContractList
     * @author yincuimei
     * @Date(2021-9-26)
     * @return
     */
    int batchUpdateCustomerContractByIds(@Param("customerContractList")List<CustomerContract> customerContractList);

    /**
     * 查询三个月内可续费的合同
     * @param accountId
     * @return
     */
    List<ContractLastThreeMonthVO> selectLastThreeMonthsContractList(@Param("accountId")String accountId);

    /**
     * 修改合同到款时间及其他可选信息
     * @Param customerContract
     * @Author xielinqi
     * @Date 2:46 下午 2021/11/9
     */
    int updateArriveTimeAndOtherSelectiveInfo(CustomerContract customerContract);

    /**
     * @author chengyun
     * @date 2021年11月18日 下午 16:39:49
     * info 根据合同类型统计上月会员合同数量 未删除 生效中
     * @param contractTypeArr 合同类型
     * @return
     */
    List<Map<String, String>> statisticalVipContractCount(@Param("contractTypeArr") char[] contractTypeArr);

    /**
     * @author chengyun
     * @date 2021年11月18日 下午 16:39:49
     * info 根据合同类型按月统计会员合同数量 未删除 生效中
     * @param contractTypeArr 合同类型
     * @return
     */
    List<Map<String, Object>> statisticalVipContractCountAll(@Param("contractTypeArr") char[] contractTypeArr);

    /**
     * 客户详情查询合同列表
     * @param customerId 客户id
     * @return
     */
    List<CustomerContractVO> selectContractByCustomerId(@Param("customerId") String customerId,@Param("accountId") String accountId,@Param("createId") String createId);


    RepaymentAbility getRepaymentAbility(@Param("dateStr") String dateStr, @Param("accountId") String accountId);

    Long getNewMemberStatistics(@Param("yearMonth") String dateStr, @Param("accountId") String accountId);

    /**
     * 合同未审核
     * @return
     */
    Integer getCustomerContractNum();

    /**
     * 创建会员统计
     * @param year
     * @return
     */
    @MapKey("month")
    List<Map<String, Object>> getContractNumByCreate(@Param("year") Integer year);

    /**
     * 通过/未通过会员统计
     * @param year
     * @return
     */
    @MapKey("month")
    List<Map<String, Object>> getContractNumByPass(@Param("year") Integer year,@Param("pathStatus") Integer pathStatus);

    /**
     * 生效会员统计
     * @param year
     * @return
     */
    @MapKey("month")
    List<Map<String, Object>> getContractNumByEffect(@Param("year") Integer year);
}
